package ratelimit

import (
	"context"
	_ "embed"
	"fmt"
	"github.com/google/uuid"
	"github.com/redis/go-redis/v9"
	"time"
)

//go:embed slide_window.lua
var luaSlideWindow string

// RedisSlidingWindowLimiter Redis 上的滑动窗口算法限流器实现
type RedisSlidingWindowLimiter struct {
	Cmd redis.Cmdable

	// 窗口大小
	Interval time.Duration
	// 阈值
	Rate int
	// Interval内允许Rate个请求
	// 1s内允许 3000个请求
}

func (r *RedisSlidingWindowLimiter) Limit(ctx context.Context, key string) (bool, error) {
	uid, err := uuid.NewUUID()
	if err != nil {
		return false, fmt.Errorf("uuid.NewUUID() failed, err:%v", err)
	}
	//r.Cmd.Eval(
	//	ctx,                  // 上下文对象，用于控制超时和取消
	//	luaSlideWindow,       // 前面定义的滑动窗口限流 Lua 脚本
	//	[]string{key},        // 传递给脚本的 KEYS 参数列表
	//	r.Interval.Milliseconds(),  // ARGV[1]：窗口大小（毫秒）
	//	r.Rate,                // ARGV[2]：限流阈值
	//	time.Now().UnixMilli(),     // ARGV[3]：当前时间戳（毫秒）
	//	uid.String()        // ARGV[4]：请求唯一标识
	//).Bool()                  // 将脚本返回结果转为布尔值
	return r.Cmd.Eval(ctx, luaSlideWindow, []string{key}, r.Interval.Milliseconds(), r.Rate, time.Now().UnixMilli(), uid.String()).Bool()
}
